//*****************************************************************************
//
// timers.c - Timers example.
//
// Copyright (c) 2005-2007 Luminary Micro, Inc.  All rights reserved.
// 
// Software License Agreement
// 
// Luminary Micro, Inc. (LMI) is supplying this software for use solely and
// exclusively on LMI's microcontroller products.
// 
// The software is owned by LMI and/or its suppliers, and is protected under
// applicable copyright laws.  All rights are reserved.  Any use in violation
// of the foregoing restrictions may subject the user to criminal sanctions
// under applicable laws, as well as to civil liability for the breach of the
// terms and conditions of this license.
// 
// THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
// 
// This is part of revision 1716 of the Stellaris Peripheral Driver Library.
//
//*****************************************************************************

#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "debug.h"
#include "interrupt.h"
#include "sysctl.h"
#include "timer.h"
#include "adc.h"
#include "gpio.h"
#include "osram96x16x1.h"

//*****************************************************************************
//
//! \addtogroup ek_lm3s811_list
//! <h1>Timer (timers)</h1>
//!
//! This example application demonstrates the use of the timers to generate
//! periodic interrupts.  One timer is set up to interrupt once per second and
//! the other to interrupt twice per second; each interrupt handler will toggle
//! its own indicator on the display.
//
//*****************************************************************************

//*****************************************************************************
//
// Flags that contain the current value of the interrupt indicator as displayed
// on the OLED display.
//
//*****************************************************************************
unsigned long g_ulFlags;
int intStatus=0;
int per=1;
unsigned long ticks=0;
//*****************************************************************************
//
// The error routine that is called if the driver library encounters an error.
//
//*****************************************************************************
#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif

//*****************************************************************************
//
// The interrupt handler for the first timer interrupt.
//
//*****************************************************************************
void
Timer0IntHandler(void)
{
    //
    // Clear the timer interrupt.
    //
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

	//if(intStatus){
	//	TimerEnable(TIMER1_BASE, TIMER_A);
	//}

	TimerLoadSet(TIMER1_BASE, TIMER_A, ticks);
	TimerEnable(TIMER1_BASE, TIMER_A);
	GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5, 0xFF);
    //
    // Toggle the flag for the first timer.
    //
   // HWREGBITW(&g_ulFlags, 0) ^= 1;

    //
    // Update the interrupt status on the display.
    //
    //IntMasterDisable();
   /// OSRAM96x16x1StringDraw(HWREGBITW(&g_ulFlags, 0) ? "1" : "0", 36, 1);
   // IntMasterEnable();
}

//*****************************************************************************
//
// The interrupt handler for the second timer interrupt.
//
//*****************************************************************************
void
Timer1IntHandler(void)
{
    //
    // Clear the timer interrupt.
    //
    TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
	GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5, 0);
    //
    // Toggle the flag for the second timer.
    //
  //  HWREGBITW(&g_ulFlags, 1) ^= 1;

    //
    // Update the interrupt status on the display.
    //
   // IntMasterDisable();
   // OSRAM96x16x1StringDraw(HWREGBITW(&g_ulFlags, 1) ? "1" : "0", 78, 1);
   // IntMasterEnable();
}

//*****************************************************************************
//
// This example demonstrates how to setup an analog comparator and trigger
// interrupts on output changes.
//
//*****************************************************************************
int
main(void)
{
	unsigned long value1, base;

    //
    // Set the clocking to run directly from the crystal.
    //
    SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_6MHZ);

    //
    // Initialize the OLED display and write status.
    //
    OSRAM96x16x1Init(false);
    OSRAM96x16x1StringDraw("Timers example", 6, 0);
    OSRAM96x16x1StringDraw("T1: 0  T2: 0", 12, 1);

    //
    // Enable the peripherals used by this example.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
	SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC);
    //
    // Enable processor interrupts.
    //
    IntMasterEnable();

	GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4);
	GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5);
    //
    // Configure the two 32-bit periodic timers.
    //
    TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
    TimerConfigure(TIMER1_BASE, TIMER_CFG_32_BIT_OS);
    base = SysCtlClockGet()/10000;
    TimerLoadSet(TIMER0_BASE, TIMER_A, base);
    TimerLoadSet(TIMER1_BASE, TIMER_A, 0);



	ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);
    ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END);
    ADCSequenceEnable(ADC_BASE, 0);
    //
    // Setup the interrupts for the timer timeouts.
    //
    IntEnable(INT_TIMER0A);
    IntEnable(INT_TIMER1A);
    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
    TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT);

    //
    // Enable the timers.
    //
    TimerEnable(TIMER0_BASE, TIMER_A);
    TimerEnable(TIMER1_BASE, TIMER_A);

    //
    // Loop forever while the timers run.
    //

    while(1)
    {

/*		if(GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4))
		{
			if(b==0)
			{
				b=1;
			}
		}else
		{
			if(b==1)
			{
				b=0;
				intStatus ^= 1;
					
			}
		}
*/		ADCProcessorTrigger(ADC_BASE, 0);
		while(!ADCIntStatus(ADC_BASE, 0, false))
		{
		}
	    ADCSequenceDataGet(ADC_BASE, 0, &value1);
		ticks = value1*(base/1023);
	
		
		/*	intStatus = TimerIntStatus(TIMER1_BASE, 0);
			if(intStatus != 0)
			{
			 TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
	
			 IntMasterDisable();
			 OSRAM96x16x1StringDraw(HWREGBITW(&g_ulFlags, 1)?"1":"0", 78, 1);
			 IntMasterEnable();
			}
			*/
    }
}
